import uvicorn #导入 Uvicorn 服务器（FastAPI 常用的 ASGI 服务器，用于运行应用）
from fastapi import FastAPI,Request #导入 FastAPI 核心类（用于创建应用）和 Request 类（用于处理请求对象）
import time  #导入时间模块，用于后续计算请求处理耗时。
from fastapi.middleware.cors import CORSMiddleware #导入跨域资源共享（CORS）中间件，解决前端跨域请求问题。
from tortoise.contrib.fastapi import register_tortoise #导入 Tortoise ORM 与 FastAPI 的集成工具，用于初始化数据库连接
from config.config import TORTOISE_ORM #从配置文件中导入数据库配置（TORTOISE_ORM 是一个字典，包含数据库连接信息、模型路径等）
from utils.t import add_jobs

app = FastAPI() #实例化 FastAPI 类，创建一个 FastAPI 应用对象 app，后续的路由、中间件等都将注册到该对象上

# 实例化 FastAPI 类，创建一个 FastAPI 应用对象 app，后续的路由、中间件等都将注册到该对象上
register_tortoise(
    app, #绑定的 FastAPI 应用实例
    config=TORTOISE_ORM,
    # generate_schemas=True,  # 如果数据库为空，则自动生成对应表单，生产环境不要开
    # add_exception_handlers=True,  # 生产环境不要开，会泄露调试信息
)

from fastapi import WebSocket, WebSocketDisconnect
from typing import List, Dict

from  views.users import users_router  #从 views.users 模块导入定义好的路由对象 users_router（通常包含用户相关的接口，如注册、登录等）
from views.dingtalk import dingtalk_router # 导入钉钉登录路由
from views.social_auth import social_auth_router # 导入社交登录路由
from views.idcard import idcard_router  # 添加身份证验证路由
from views.qiniu_and_realname import qiniu_router, realname_router
from views.web import web_router
from tools.webscoket import manager
app.include_router(web_router)
app.include_router(users_router)  # 将 users_router 中的路由注册到主应用 app 中，使得这些接口可以通过主应用访问
app.include_router(dingtalk_router)  # 将 dingtalk_router 中的路由注册到主应用 app 中
app.include_router(social_auth_router, prefix="/auth")  # 将社交登录路由注册到主应用 app 中
app.include_router(idcard_router)  # 注册身份证验证路由
app.include_router(qiniu_router)
app.include_router(realname_router)
from utils.t import scheduler
# . 配置 CORS 跨域中间件
origins = [
    "http://localhost",
    "http://localhost:5173",
    # 可以添加更多允许的域名，如生产环境域名
    "https://yourproductiondomain.com"
]

# 添加 CORS 中间件
app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,  # 允许的来源列表
    allow_credentials=True,  # 允许携带凭证（如 cookies）
    allow_methods=["*"],  # 允许的 HTTP 方法，* 表示允许所有方法
    allow_headers=["*"],  # 允许的 HTTP 请求头，* 表示允许所有头
)
@app.on_event("startup")
async def startup_event():
    # 设置WebSocket管理器的主事件循环
    import asyncio
    loop = asyncio.get_event_loop()
    manager.set_main_loop(loop)
    print("WebSocket管理器已设置主事件循环")
    
    add_jobs()
    scheduler.start()
    print("调度器已启动")
@app.on_event("shutdown")
def shutdown_event():
    scheduler.shutdown()
    print("调度器已关闭")

@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.middleware("http")
async def m2(request: Request, call_next):
    # 请求代码块
    print("m2 request")
    response = await call_next(request)
    # 响应代码块
    response.headers["author"] = "moluo"
    print("m2 response")
    return response


@app.middleware("http")
async def m1(request: Request, call_next):
    # 请求代码块
    print("m1 request")
    # if request.client.host in ["127.0.0.1", ]:  # 黑名单
    #     return Response(content="visit forbidden")

    # if request.url.path in ["/user"]:
    #     return Response(content="visit forbidden")

    start = time.time()

    response = await call_next(request)
    # 响应代码块
    print("m1 response")
    end = time.time()
    response.headers["ProcessTimer"] = str(end - start)
    return response




# active_connections:List[WebSocket] = []
# client_connections:Dict[str, WebSocket]={}
#
# async def broadcast(message: str):
#     for connection in active_connections:
#         await connection.send_text(message)
#
# async def send_to_client(client_id: str, message: str):
#     if client_id in client_connections:
#         print("发送")
#         print(client_connections)
#         print(client_id)
#         await client_connections[client_id].send_text(message)
#
# import asyncio
#
#
# @app.websocket("/ws/{client_id}")
# async def websocket_endpoint(websocket: WebSocket, client_id: int):
#     await websocket.accept()
#     client_connections['123'] = websocket
#     print(f"客户端{client_id} 已连接，当前连接数：{len(active_connections)}")
#
#     try:
#         while True:
#             data = await websocket.receive_text()
#             print(f"收到客户端{client_id}的消息：{data}")
#             await websocket.send_text(f"服务器已收到你的消息：{data}")
#             await asyncio.sleep(5)
#             await websocket.send_text(f"服务器主动推送：你5秒前发送了：{data}")
#
#     except WebSocketDisconnect:
#         active_connections.remove(websocket)
#         client_connections.pop(client_id, None)
#         print(f"客户端{client_id} 已断开，当前连接数：{len(active_connections)}")

# @app.get("/push/")
# async def push_to_client():
#     print("push")
#     await send_to_client("123", "管理员推送")

if __name__ == '__main__':

    uvicorn.run("index:app", host="127.0.0.1", port=8888, reload=True)